Power Analysis

Introduction

This work builds on my first (and failed) attempt to estimate how many ratings one needs to sample to have a reliable measure of a certain population. Therefore, readers are advised to catch up on my previous work to be up to speed on this smaller project.

As the unconventional approach did not work, we will revert back to the more “old school” methodologies of an a priori power analysis. That is, estimating the minimum sample size needed to uncover a set effect size (or bigger), given a significance level and type II (false negatives) error.

Method

The group has chosen to employ a 11-point likert scale instead of the previously used 101. Therefore, this work will also employ this scale.

As we have no real consensus what polarization entails, getting a numerical quantifier for the effect size seems to be out of the question. 4 preset Distributions were chosen again, each with differing grade of polarization. For readers who feel familiar with the colors from my prior simulation, most of the distributions have adopted the same spirit from its predecessor, but some changes were made:

  • None (a Normal Distribution, but this time with a shifted mean instead of the midpoint)
  • Small polarization (the skewed beta distribution from prior work was replaced with this one, representing a smaller polarization in the population)
  • Rare (a majority rating on one extreme, while a minority group with base rate of 5 on the other extreme)
  • Strong polarization (still the symmetrical version, but this time in discrete shape)

It is important to note that while the normal and strong polarization distribution represent no and strong effects, the small and rare distributions should both illustrate small effects in the population, and putting one over the other really depends on how to interpret/ operationalize polarization itself (e.g. asymmetry, distance, or agreement).

For this work, we will use the same sample sizes as the previous one, consisting of 20 different sample sizes:

##  [1]  10  20  30  40  50  60  70  80  90 100 110 120 130 140 150 160 170 180 190
## [20] 200

For each sample size, we replicate the random draw 200 times. For each of the samples, the measures of bimodality coefficient (BC), polarization and group divergence are calculated. Similar to classification problems though, we will have to set thresholds for each measure, where values above a threshold indicate polarization, while those falling below indicate the absence of polarization. Luckily, the BC already has a set threshold of \(0.\overline{5}\).

For the two other measures, I looked at the previous results, and the measurement of polarization has a low value for the rare distribution, even lower than the normal distribution (as it uses a weighted sum, thus small groups are discounted). Setting a low threshold so rare distributions are also classified as polarized will therefore also net us too many false negatives (e.g. saying normal distributions are polarized). I’ll set the group divergence threshold arbitrarily at 0.5 and polarization threshold at 0.5 and see how it goes…

Again, this is how our sampled matrix looks like, adopting a staircase like shape. Using this method saves us time, as well as prevents errors.

After we’ve calculated the operationalisation measures for each of the 16000 drawn samples, the measures were put into a data frame. As we can see, no missing values are here, indicating that each measure was calculated successfully.

Results

Polarization Values for the Population Distribution

Polarization Measures in the Population Distributions
Population Distribution Bimodality Coefficient Group Divergence Polarization
None 0.345 0.287 0.152
Small Pol. 0.655 0.288 0.297
Rare 0.766 0.762 0.185
Strong Pol. 0.884 0.804 0.823

Drawn Sample Table

Overall Plot

## # A tibble: 80 × 4
## # Groups:   Measure, transl_risk_distr [4]
##    Measure transl_risk_distr sample_size `Prop_as_polarized_in_%`
##    <chr>   <fct>                   <dbl>                    <dbl>
##  1 BC      None                       10                      2  
##  2 BC      None                       20                      2  
##  3 BC      None                       30                      1.5
##  4 BC      None                       40                      0.5
##  5 BC      None                       50                      0  
##  6 BC      None                       60                      0  
##  7 BC      None                       70                      0  
##  8 BC      None                       80                      0  
##  9 BC      None                       90                      0  
## 10 BC      None                      100                      0  
## # ℹ 70 more rows

Discussion

Limitations

as like in all classifications, no clear cut line between pol vs none, but gradual.

in accordance to the previous one, setting the assumption that the rare polarization is, in fact, polarized, may not hold well in the study itself, as smaller outliers, misinterpretation or even a mouse slip may contribute to such a distribution, which we would then just assume is polarized.

the treshhold were set somewhat arbitrary, and therefore, may not hold in the real deal, and cannot be generalized for further distributions, but only for the ones seen here. One might change the treshhold to find an optimized one where we would have the least false positives and false negatives, but this threshold will not generalize for other distributions. As such, I’ll refrain from finding the optimum, as it would net us not any additional insight to our cause.

only 3 measures of operatioalization was used, and thus, not every aspect of operationalization was covered.

Conclusions

Credits

Acknowledgements

R Packages Used

Use of AI

LS0tDQp0aXRsZTogIlJpc2sgUG9sYXJpemF0aW9uIFBvd2VyIEFuYWx5c2lzIg0KYXV0aG9yOiAiQW5keSBDYW8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICAgaHRtbF9kb2N1bWVudDoNCiAgICAgIGNzczogc3R5bGVzLmNzcw0KICAgICAgdG9jOiB0cnVlDQogICAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX2NvbnRyb2xsOiBmYWxzZQ0KICAgICAgZmlnLndpZHRoOiAyNg0KICAgICAgZmlnLmhlaWdodDogMjYNCiAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KYGBge3IgU2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkgI2RhdGEgd3JhbmdsaW5nIGFuZCBvdGhlciB0b29scyBmb3IgUg0KbGlicmFyeShrbml0cikgIyByZXBvcnQgZ2VuZXJhdGlvbiBpbiBSDQpsaWJyYXJ5KHBzeWNoKSAjY2FsY3VsYXRlIHNrZXcgYW5kIGt1cnRvc2lzIGZvciBCQw0KbGlicmFyeShhZ3JtdCkgI2ZvciBhZ3JlZW1lbnQgYW5kIHBvbGFyaXphdGlvbiBjYWxjdWxhdGlvbg0KbGlicmFyeSh2aXNkYXQpICN2aXN1YWxpemUgZGF0YWZyYW1lcyBpbiBwbG90cw0KbGlicmFyeShSQ29sb3JCcmV3ZXIpICNlYXN5IHRvIHVzZSBjb2xvciBwYWxldHRlcw0KbGlicmFyeShybWFya2Rvd24pICNmb3IgdGhlIHBhZ2VkX3RhYmxlIGZ1bmN0aW9uDQpsaWJyYXJ5KGRvUGFyYWxsZWwpICNwYXJhbGxlbCBjb21wdXRhdGlvbiB1c2luZyBtdWx0aXBsZSBjb3Jlcw0KbGlicmFyeShmb3JlYWNoKSAjIGZvciBlYWNoIGZ1bmN0aW9uLCBzbyB0aGUgc2ltdWxhdGlvbiBkb2VzIG5vdCB0YWtlIGFnZXMNCg0KY29sb3JzIDwtIGJyZXdlci5wYWwoNCwgIkRhcmsyIikNCg0Kbl9zY2FsZV9vbl9saWtlcnQgPC0gYygxOjExKQ0KbWluX2xpa2VydCA8LSBtaW4obl9zY2FsZV9vbl9saWtlcnQpDQptYXhfbGlrZXJ0IDwtIG1heChuX3NjYWxlX29uX2xpa2VydCkNCg0Kc2FtcGxlX3NlcXVlbmNlIDwtIHNlcSgxMCwyMDAsYnkgPTEwKQ0Kc2FtcGxlZCA8LSBkYXRhLmZyYW1lKE5fcGFydCA9IHNhbXBsZV9zZXF1ZW5jZSkNCg0KcmVwbGljYXRpb25zX3Blcl9zZXR0aW5nIDwtIDIwMA0KDQpuX3BvcHVsYXRpb24gPC0gMTBeNA0KcHJvcF9taW5vcml0eSA8LSAuMDUNCg0KQkNfdGhyZXNob2xkIDwtIDUvOQ0KcG9sYXJpemF0aW9uX3RocmVzaG9sZCA8LSAuNQ0KZ3JvdXBfZGl2ZXJnZW5jZV90aHJlc2hvbGQgPC0gLjUNCg0KI3NldCBzZWVkIHNvIGV2ZXJ5IHJhbmRvbSB0aGluZyBoZXJlIGlzIHJlcHJvZHVjaWJsZQ0Kc2V0LnNlZWQoNDIpDQoNCiNzZXQgZWNobyA9IEZBTFNFIChlLmcuIGRvbnQgc2hvdyBjb2RlIGluIG91dHB1dCkgZm9yIGFsbCBjaHVua3MsIGV4Y2VwdCB3aGVuIGV4cGxpY2l0bHkgdGVsbGluZyBvdGhlcndpc2UNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgIGVjaG8gPSBGQUxTRSwNCiAgIHdhcm5pbmcgPSBUUlVFLA0KICAgbWVzc2FnZSA9IFRSVUUNCiAgICkNCmBgYA0KIyBQb3dlciBBbmFseXNpcw0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyB3b3JrIGJ1aWxkcyBvbiBteSBbZmlyc3QgKGFuZCBmYWlsZWQpIGF0dGVtcHRdKFJpc2stUG9sYXJpemF0aW9uLVNpbXVsYXRpb24uaHRtbCkgdG8gZXN0aW1hdGUgaG93IG1hbnkgcmF0aW5ncyBvbmUgbmVlZHMgdG8gc2FtcGxlIHRvIGhhdmUgYSByZWxpYWJsZSBtZWFzdXJlIG9mIGEgY2VydGFpbiBwb3B1bGF0aW9uLiBUaGVyZWZvcmUsIHJlYWRlcnMgYXJlIGFkdmlzZWQgdG8gY2F0Y2ggdXAgb24gbXkgcHJldmlvdXMgd29yayB0byBiZSB1cCB0byBzcGVlZCBvbiB0aGlzIHNtYWxsZXIgcHJvamVjdC4gIA0KDQpBcyB0aGUgdW5jb252ZW50aW9uYWwgYXBwcm9hY2ggZGlkIG5vdCB3b3JrLCB3ZSB3aWxsIHJldmVydCBiYWNrIHRvIHRoZSBtb3JlICJvbGQgc2Nob29sIiBtZXRob2RvbG9naWVzIG9mIGFuIGEgcHJpb3JpIHBvd2VyIGFuYWx5c2lzLiBUaGF0IGlzLCBlc3RpbWF0aW5nIHRoZSBtaW5pbXVtIHNhbXBsZSBzaXplIG5lZWRlZCB0byB1bmNvdmVyIGEgc2V0IGVmZmVjdCBzaXplIChvciBiaWdnZXIpLCBnaXZlbiBhIHNpZ25pZmljYW5jZSBsZXZlbCBhbmQgdHlwZSBJSSAoZmFsc2UgbmVnYXRpdmVzKSBlcnJvci4gIA0KDQoNCg0KIyMgTWV0aG9kDQoNClRoZSBncm91cCBoYXMgY2hvc2VuIHRvIGVtcGxveSBhIDExLXBvaW50IGxpa2VydCBzY2FsZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91c2x5IHVzZWQgMTAxLiBUaGVyZWZvcmUsIHRoaXMgd29yayB3aWxsIGFsc28gZW1wbG95IHRoaXMgc2NhbGUuICANCg0KQXMgd2UgaGF2ZSBubyByZWFsIGNvbnNlbnN1cyB3aGF0IHBvbGFyaXphdGlvbiBlbnRhaWxzLCBnZXR0aW5nIGEgbnVtZXJpY2FsIHF1YW50aWZpZXIgZm9yIHRoZSBlZmZlY3Qgc2l6ZSBzZWVtcyB0byBiZSBvdXQgb2YgdGhlIHF1ZXN0aW9uLiA0IHByZXNldCBEaXN0cmlidXRpb25zIHdlcmUgY2hvc2VuIGFnYWluLCBlYWNoIHdpdGggZGlmZmVyaW5nIGdyYWRlIG9mIHBvbGFyaXphdGlvbi4gRm9yIHJlYWRlcnMgd2hvIGZlZWwgZmFtaWxpYXIgd2l0aCB0aGUgY29sb3JzIGZyb20gbXkgcHJpb3Igc2ltdWxhdGlvbiwgbW9zdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBoYXZlIGFkb3B0ZWQgdGhlIHNhbWUgc3Bpcml0IGZyb20gaXRzIHByZWRlY2Vzc29yLCBidXQgc29tZSBjaGFuZ2VzIHdlcmUgbWFkZTogIA0KDQotIFsqKk5vbmUqKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbMV1gOyJ9IChhIE5vcm1hbCBEaXN0cmlidXRpb24sIGJ1dCB0aGlzIHRpbWUgd2l0aCBhIHNoaWZ0ZWQgbWVhbiBpbnN0ZWFkIG9mIHRoZSBtaWRwb2ludCkgIA0KLSBbKipTbWFsbCBwb2xhcml6YXRpb24qKl17c3R5bGU9ImNvbG9yOiBgciBjb2xvcnNbMl1gOyJ9ICh0aGUgc2tld2VkIGJldGEgZGlzdHJpYnV0aW9uIGZyb20gcHJpb3Igd29yayB3YXMgcmVwbGFjZWQgd2l0aCB0aGlzIG9uZSwgcmVwcmVzZW50aW5nIGEgc21hbGxlciBwb2xhcml6YXRpb24gaW4gdGhlIHBvcHVsYXRpb24pICANCi0gWyoqUmFyZSoqXXtzdHlsZT0iY29sb3I6IGByIGNvbG9yc1szXWA7In0gKGEgbWFqb3JpdHkgcmF0aW5nIG9uIG9uZSBleHRyZW1lLCB3aGlsZSBhIG1pbm9yaXR5IGdyb3VwIHdpdGggYmFzZSByYXRlIG9mIGBgciBwcm9wX21pbm9yaXR5ICoxMDBgYCBvbiB0aGUgb3RoZXIgZXh0cmVtZSkgIA0KLSBbKipTdHJvbmcgcG9sYXJpemF0aW9uKipde3N0eWxlPSJjb2xvcjogYHIgY29sb3JzWzRdYDsifSAoc3RpbGwgdGhlIHN5bW1ldHJpY2FsIHZlcnNpb24sIGJ1dCB0aGlzIHRpbWUgaW4gZGlzY3JldGUgc2hhcGUpICANCg0KSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3aGlsZSB0aGUgbm9ybWFsIGFuZCBzdHJvbmcgcG9sYXJpemF0aW9uIGRpc3RyaWJ1dGlvbiByZXByZXNlbnQgbm8gYW5kIHN0cm9uZyBlZmZlY3RzLCB0aGUgc21hbGwgYW5kIHJhcmUgZGlzdHJpYnV0aW9ucyBzaG91bGQgYm90aCBpbGx1c3RyYXRlIHNtYWxsIGVmZmVjdHMgaW4gdGhlIHBvcHVsYXRpb24sIGFuZCBwdXR0aW5nIG9uZSBvdmVyIHRoZSBvdGhlciByZWFsbHkgZGVwZW5kcyBvbiBob3cgdG8gaW50ZXJwcmV0LyBvcGVyYXRpb25hbGl6ZSBwb2xhcml6YXRpb24gaXRzZWxmIChlLmcuIGFzeW1tZXRyeSwgZGlzdGFuY2UsIG9yIGFncmVlbWVudCkuICANCg0KYGBge3IgR2VuZXJhdGlvbiBvZiBQb3B1bGF0aW9uIERpc3RyaWJ1dGlvbn0NCg0Kbm9ybWFsIDwtIHJvdW5kKHJub3JtKG5fcG9wdWxhdGlvbiwgbWVhbiA9IDgsc2QgPSAxLjIpKQ0Kbm9ybWFsIDwtIHBtaW4ocG1heChub3JtYWwsIG1pbl9saWtlcnQpLCBtYXhfbGlrZXJ0KQ0KDQpzdHJvbmdfcG9sIDwtIHJvdW5kKHJiZXRhKG5fcG9wdWxhdGlvbiwgc2hhcGUxID0gLjEsIHNoYXBlMiA9IC4xKSoxMCkgKzENCnN0cm9uZ19wb2wgPC0gcG1pbihwbWF4KHN0cm9uZ19wb2wsIG1pbl9saWtlcnQpLCBtYXhfbGlrZXJ0KQ0KDQpyYXJlIDwtIGMocm91bmQocm5vcm0obl9wb3B1bGF0aW9uICooMS0gcHJvcF9taW5vcml0eSksIG1lYW4gPSAyLHNkID0gMS4zKSksIA0KICAgICAgICAgICByb3VuZChybm9ybShuX3BvcHVsYXRpb24gKnByb3BfbWlub3JpdHksIG1lYW4gPSAxMSxzZCA9IC41KSkpDQpyYXJlIDwtIHBtaW4ocG1heChyYXJlLCBtaW5fbGlrZXJ0KSwgbWF4X2xpa2VydCkNCg0Kc21hbGxfcG9sIDwtIGMocm91bmQocm5vcm0obl9wb3B1bGF0aW9uICouNjUsIG1lYW4gPSA2LHNkID0gLjkpKSwgDQogICAgICAgICAgIHJvdW5kKHJub3JtKG5fcG9wdWxhdGlvbiAqIC4zNSwgbWVhbiA9IDEwLHNkID0gLjUpKSkNCnNtYWxsX3BvbCA8LSBwbWluKHBtYXgoc21hbGxfcG9sLCBtaW5fbGlrZXJ0KSwgbWF4X2xpa2VydCkNCg0KDQpQb3BfZGYgPC0gZGF0YS5mcmFtZShgTm9ybWFsIERpc3RyaWJ1dGlvbmA9IG5vcm1hbCwNCiAgICAgICAgICAgICAgICAgICAgIGBTbWFsbCBQb2xhcml6YXRpb25gID0gc21hbGxfcG9sLA0KICAgICAgICAgICAgICAgICAgICAgYFJhcmUgUG9sYXJpemF0aW9uYCA9IHJhcmUsDQogICAgICAgICAgICAgICAgICAgICBgU3Ryb25nIFBvbGFyaXphdGlvbmAgPSBzdHJvbmdfcG9sKQ0KDQpuYW1lcyhQb3BfZGYpIDwtIGMoIk5vbmUiLCAiU21hbGwgUG9sLiIsICJSYXJlIiwgIlN0cm9uZyBQb2wuIikNCg0KDQoNClBvcF9kZl9wbG90IDwtIFBvcF9kZiAlPiUgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgdmFsdWVzX3RvID0gIlJhdGluZyIsIG5hbWVzX3RvID0gIkRpc3RyIikgJT4lIA0KICAgbXV0YXRlKERpc3RyID0gZmFjdG9yKERpc3RyLCBsZXZlbHMgPSBjKCJOb25lIiwgIlNtYWxsIFBvbC4iLCJSYXJlIiwgIlN0cm9uZyBQb2wuIikpKQ0KDQpQb3BfZGZfcGxvdCAlPiUgZ2dwbG90KGFlcyhSYXRpbmcsIGZpbGwgPSBEaXN0cikpKw0KICAgZ2VvbV9iYXIod2lkdGg9IC43NSkrDQogICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKERpc3RyKSkrDQogICBzY2FsZV94X2NvbnRpbnVvdXMobi5icmVha3MgPSAxMSwgZXhwYW5kID0gYygwLDApKSsNCiAgIHRoZW1lX21pbmltYWwoKSsNCiAgIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEsIDIsIDAsIDApDQogICAgICAgICApKw0KICAgZ2VvbV90ZXh0KGFlcyh4PTYseSA9IDM1MDAsIGxhYmVsPSBEaXN0ciwgY29sb3IgPSBEaXN0ciksIHNpemUgPSA2LjgpKw0KICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JzKSsNCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpKw0KICAgeWxhYigiQ291bnQiKQ0KYGBgDQogIA0KRm9yIHRoaXMgd29yaywgd2Ugd2lsbCB1c2UgdGhlIHNhbWUgc2FtcGxlIHNpemVzIGFzIHRoZSBwcmV2aW91cyBvbmUsIGNvbnNpc3Rpbmcgb2YgYGByIG5yb3coc2FtcGxlZClgYCBkaWZmZXJlbnQgc2FtcGxlIHNpemVzOiAgDQpgYGB7ciBTaG93IHNhbXBsZSBzZXF1ZW5jZX0NCnNhbXBsZV9zZXF1ZW5jZQ0KYGBgDQogIA0KRm9yIGVhY2ggc2FtcGxlIHNpemUsIHdlIHJlcGxpY2F0ZSB0aGUgcmFuZG9tIGRyYXcgYGByIHJlcGxpY2F0aW9uc19wZXJfc2V0dGluZ2BgIHRpbWVzLiBGb3IgZWFjaCBvZiB0aGUgc2FtcGxlcywgdGhlIG1lYXN1cmVzIG9mIGJpbW9kYWxpdHkgY29lZmZpY2llbnQgKEJDKSwgcG9sYXJpemF0aW9uIGFuZCBncm91cCBkaXZlcmdlbmNlIGFyZSBjYWxjdWxhdGVkLiBTaW1pbGFyIHRvIGNsYXNzaWZpY2F0aW9uIHByb2JsZW1zIHRob3VnaCwgd2Ugd2lsbCBoYXZlIHRvIHNldCB0aHJlc2hvbGRzIGZvciBlYWNoIG1lYXN1cmUsIHdoZXJlIHZhbHVlcyBhYm92ZSBhIHRocmVzaG9sZCBpbmRpY2F0ZSBwb2xhcml6YXRpb24sIHdoaWxlIHRob3NlIGZhbGxpbmcgYmVsb3cgaW5kaWNhdGUgdGhlIGFic2VuY2Ugb2YgcG9sYXJpemF0aW9uLiBMdWNraWx5LCB0aGUgQkMgYWxyZWFkeSBoYXMgYSBzZXQgdGhyZXNob2xkIG9mICQwLlxvdmVybGluZXs1fSQuIA0KDQpGb3IgdGhlIHR3byBvdGhlciBtZWFzdXJlcywgSSBsb29rZWQgYXQgdGhlIHByZXZpb3VzIHJlc3VsdHMsIGFuZCB0aGUgbWVhc3VyZW1lbnQgb2YgcG9sYXJpemF0aW9uIGhhcyBhIGxvdyB2YWx1ZSBmb3IgdGhlIHJhcmUgZGlzdHJpYnV0aW9uLCBldmVuIGxvd2VyIHRoYW4gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gKGFzIGl0IHVzZXMgYSB3ZWlnaHRlZCBzdW0sIHRodXMgc21hbGwgZ3JvdXBzIGFyZSBkaXNjb3VudGVkKS4gU2V0dGluZyBhIGxvdyB0aHJlc2hvbGQgc28gcmFyZSBkaXN0cmlidXRpb25zIGFyZSBhbHNvIGNsYXNzaWZpZWQgYXMgcG9sYXJpemVkIHdpbGwgdGhlcmVmb3JlIGFsc28gbmV0IHVzIHRvbyBtYW55IGZhbHNlIG5lZ2F0aXZlcyAoZS5nLiBzYXlpbmcgbm9ybWFsIGRpc3RyaWJ1dGlvbnMgYXJlIHBvbGFyaXplZCkuIEknbGwgc2V0IHRoZSBncm91cCBkaXZlcmdlbmNlIHRocmVzaG9sZCBhcmJpdHJhcmlseSBhdCBgYHIgZ3JvdXBfZGl2ZXJnZW5jZV90aHJlc2hvbGRgYCBhbmQgcG9sYXJpemF0aW9uIHRocmVzaG9sZCBhdCBgYHIgcG9sYXJpemF0aW9uX3RocmVzaG9sZGBgIGFuZCBzZWUgaG93IGl0IGdvZXMuLi4gIA0KDQpgYGB7ciBTYW1wbGluZ30NCm1heF9jb2xzIDwtIG1heChzYW1wbGVkKSAgIA0KDQojIFJlZ2lzdGVyIHBhcmFsbGVsIGJhY2tlbmQgd2l0aCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgY29yZXMNCm51bV9jb3JlcyA8LSBkZXRlY3RDb3JlcygpLTENCg0KY2wgPC0gbWFrZUNsdXN0ZXIobnVtX2NvcmVzKQ0KcmVnaXN0ZXJEb1BhcmFsbGVsKGNsKQ0KDQojcm90YXRlIFBvcF9kZiwgc28gb3VyIGZ1bmN0aW9uIHdvcmtzIChlYWNoIHJvdyBuZWVkcyB0byBiZSBhIGRpZmZlcmVudCBkaXN0cmlidXRpb24sIGluc3RlYWQgb2YgZWFjaCBjb2wpDQpyb3RfUG9wX2RmIDwtIGFzLmRhdGEuZnJhbWUodChQb3BfZGYpKQ0KDQojIERlZmluZSBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggY29tYmluYXRpb24gb2Ygcmlza19kaXN0cmlidXRpb24sIHNhbXBsZXNpemUgYW5kIHJlcGxpY2F0aW9ucyBwZXIgc2V0dGluZw0Kc2FtcGxlX2FuZF9yZXBsaWNhdGVfZm9yX2FsbF9yaXNrcyA8LSBmdW5jdGlvbihpKSB7DQogIHNhbXBsZWRfbWF0cml4X2xpc3QgPC0gbGlzdCgpDQogIA0KICBmb3IgKGogaW4gMTpucm93KHJvdF9Qb3BfZGYpKSB7DQogICAgbWF0IDwtIHJlcGxpY2F0ZShyZXBsaWNhdGlvbnNfcGVyX3NldHRpbmcsDQogICAgICAgICAgICAgICAgICAgICBzYW1wbGUoMTpuX3BvcHVsYXRpb24sIHNpemUgPSBzYW1wbGVkW2ksIDFdLCByZXBsYWNlID0gVFJVRSkpICNjcmVhdGUgbWF0cml4IG9mIG91ciBzYW1wbGVzIHdpdGggcmVwbGFjaW5nLCB0aW1lcyBuIC0gcmVwbGljYXRpb25zDQogICAgDQogICAgc2FtcGxlZF90YWJsZSA8LSByb3RfUG9wX2RmW2osIG1hdF0gI3VzaW5nIHRoZSBtYXRyaXgsIGNvbGxlY3QgdGhlIHZhbHVlcyBmcm9tIG91ciByaXNrIGRpc3RyaWJ1dGlvbiBtYXRyaXggKGFzIGEgdmVjdG9yIHRob3VnaC4uLikNCiAgICBzYW1wbGVkX21hdHJpeCA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeChzYW1wbGVkX3RhYmxlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSByZXBsaWNhdGlvbnNfcGVyX3NldHRpbmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IHNhbXBsZWRbaSwgMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnlyb3cgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gTlVMTCkpICNjcmVhdGUgZGYgb3V0IG9mIHRoZXNlIHZlY3RvcnMgaW5zdGVhZCBvZiBmbGF0IHZlY3RvcnMNCiAgICANCiAgICANCiAgICBpZiAobmNvbChzYW1wbGVkX21hdHJpeCkgPCBtYXhfY29scykgew0KICAgICAgcGFkZGluZ19tYXRyaXggPC0gbWF0cml4KE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSBucm93KHNhbXBsZWRfbWF0cml4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gbWF4X2NvbHMgLSBuY29sKHNhbXBsZWRfbWF0cml4KSkNCiAgICAgIHNhbXBsZWRfbWF0cml4IDwtIGNiaW5kKHNhbXBsZWRfbWF0cml4LCBwYWRkaW5nX21hdHJpeCkNCiAgICB9ICNpZiBtYXRyaXggaXMgbm90IHdpZGUgZW5vdWdoIGZvciBvdXIgZW5kIHJlc3VsdCBtYXRyaXgsIHBhZGQgaXQgd2l0aCBOQSBjb2x1bW5zLCBzbyBiaW5kaW5nIHJvd3MgaXMgZG9hYmxlIChuZWVkcyBzYW1lIGFtb3VudCBvZiBuY29scykNCiAgICANCiAgICBzYW1wbGVkX21hdHJpeCA8LSBjYmluZChtYXRyaXgoc2FtcGxlZFtpLDFdLCBucm93ID0gcmVwbGljYXRpb25zX3Blcl9zZXR0aW5nKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4KGosIG5yb3cgPSByZXBsaWNhdGlvbnNfcGVyX3NldHRpbmcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRfbWF0cml4KSAjYmluZCBjb2x1bW5zIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHNhbXBsZSBzaXplIGFuZCB3aGljaCByaXNrX2Rpc3RyaWJ1dGlvbiB3YXMgc2FtcGxlZA0KICAgIA0KICAgIGNvbG5hbWVzKHNhbXBsZWRfbWF0cml4KSA8LSBjKCJzYW1wbGVfc2l6ZSIsICJyaXNrX2Rpc3RyaWJ1dGlvbiIsIHBhc3RlMCgicmF0aW5nXyIsIDE6bWF4X2NvbHMpKSAjcmV3cml0ZSBjb2xuYW1lcyBzbyBpdCBpcyBpZGVudGljYWwgdG8gdGhlIGJpZ2ggbWF0cml4DQogICAgc2FtcGxlZF9tYXRyaXhfbGlzdFtbal1dIDwtIHNhbXBsZWRfbWF0cml4ICNzdG9yZSBpbiBsaXN0DQogIH0NCiAgcmV0dXJuKGRvLmNhbGwocmJpbmQsIHNhbXBsZWRfbWF0cml4X2xpc3QpKSAjYWZ0ZXIgYWxsIHJpc2sgZGlzdHJpYnV0aW9ucyBhcmUgc2FtcGxlZCBmcm9tLCBiaW5kIHRoZW0gYWxsIGFuZCByZXR1cm4gdGhlIG91dHB1dA0KICANCn0NCg0KIyBQZXJmb3JtIHBhcmFsbGVsIHByb2Nlc3NpbmcgdXNpbmcgZm9yZWFjaCwgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGRpZmZlcmVudCBzYW1wbGVzaXplcw0KcmVzdWx0IDwtIGZvcmVhY2goaSA9IDE6bnJvdyhzYW1wbGVkKSwgLmNvbWJpbmUgPSByYmluZCkgJWRvcGFyJSB7DQogIHNhbXBsZV9hbmRfcmVwbGljYXRlX2Zvcl9hbGxfcmlza3MoaSkNCn0NCg0KIyBTdG9wIHRoZSBwYXJhbGxlbCBiYWNrZW5kDQpzdG9wQ2x1c3RlcihjbCkNCg0KcmVzdWx0IDwtIG11dGF0ZV9hbGwocmVzdWx0LCBhcy5udW1lcmljICkNCg0KDQp2aXNfbWlzcyhyZXN1bHRbLHNlcShmcm9tID0zLCB0byA9IG5jb2wocmVzdWx0KSwgbGVuZ3RoLm91dCA9IDQwKV0sIHNob3dfcGVyY19jb2wgPSBGKQ0KYGBgICANCiAgDQpBZ2FpbiwgdGhpcyBpcyBob3cgb3VyIHNhbXBsZWQgbWF0cml4IGxvb2tzIGxpa2UsIGFkb3B0aW5nIGEgc3RhaXJjYXNlIGxpa2Ugc2hhcGUuIFVzaW5nIHRoaXMgbWV0aG9kIHNhdmVzIHVzIHRpbWUsIGFzIHdlbGwgYXMgcHJldmVudHMgZXJyb3JzLiAgDQoNCmBgYHtyIENhbGN1bGF0aW5nIFBvbGFyaXNhdGlvbiBNZWFzdXJlc30NCiN0YWtlbiBmcm9tIG15IHByZXZpb3VzIHdvcmsNCmNhbGNfZ3JvdXBfZGl2ZXJnZW5jZSA8LSBmdW5jdGlvbih2ZWMsIG1pZHBvaW50ID0gNiwgc2NhbGVfcmFuZ2UgPSAxMSl7DQogICANCiAgIFhfaGlnaCA8LSBtZWFuKHZlY1t2ZWMgPj0gbWlkcG9pbnRdLCBuYS5ybSA9IFRSVUUpDQogICBpZihzdW0odmVjW3ZlYyA+PSBtaWRwb2ludF0sIG5hLnJtID1UICkgPT0gMCl7DQogICAgICBYX2hpZ2ggPC0gMA0KICAgfQ0KICAgDQogICBYX2xvdyA8LSAgbWVhbih2ZWNbdmVjIDwgbWlkcG9pbnRdLCBuYS5ybSA9IFRSVUUpDQogICBpZihzdW0odmVjW3ZlYyA8IG1pZHBvaW50XSwgbmEucm0gPVQgKSA9PSAwKXsNCiAgICAgIFhfbG93IDwtIDANCiAgIH0NCiAgIHJldHVybigoYWJzKFhfaGlnaCAtIFhfbG93KS8gc2NhbGVfcmFuZ2UpKQ0KfQ0KDQoNCmNhbGNfYmltb2RhbGl0eV9jb2VmZmljaWVudCA8LSBmdW5jdGlvbih2ZWMpew0KICAgc2tldyA8LSBza2V3KHZlYywgbmEucm0gPSBUUlVFLCB0eXBlID0gMykNCiAgIGt1cnRvc2lzIDwtIGt1cnRvc2kodmVjLCBuYS5ybSA9IFRSVUUsIHR5cGUgPSAzKQ0KICAgbiA8LSBzdW0oIWlzLm5hKHZlYykpDQogICByZXR1cm4oKHNrZXdeMisxKSAvIChrdXJ0b3NpcyArICgoMyooKG4tMSkpXjIpLygobi0yKSoobi0zKSkpICkpDQp9DQoNCiMgQ3JlYXRlZCB0aGlzIG9uZSAiZnJvbSBzY3JhdGNoIiwgYXMgd2Ugd29yayB3aXRoIGEgc21hbGxlciBzY2FsZSBvZiAxMSBpbnN0ZWFkIG9mIDEwMSwgdGhlIGNhbGN1bGF0aW9uIG9mIHBvbGFyaXphdGlvbiBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIGFueW1vcmUNCg0KY2FsY19wb2xhcml6YXRpb24gPC0gZnVuY3Rpb24odmVjKXsNCiAgIHZlYzIgPC0gYXMudmVjdG9yKHZlYykNCiAgIGZyZXFfdmVjIDwtIGFncm10Ojpjb2xsYXBzZSh2ZWMyLCBwb3MgPSBjKDE6MTEpKQ0KICAgcmV0dXJuKGFncm10Ojpwb2xhcml6YXRpb24oZnJlcV92ZWMpKQ0KfQ0KDQojIHRoaXMgY29kZSBpcyBjb21tZW50ZWQsIGFzIHRoZSBjb21wdXRhdGlvbiB0YWtlcyB0b28gbG9uZywgYW5kIEkgaGF0ZSB3YWl0aW5nIHdoaWxlIGtuaXRpbmcuIEkgaGF2ZSBzYXZlZCBhIHNlcHBhcmF0ZSByZHMgZmlsZSwgd2hpY2ggd2lsbCBiZSByZWFkIGluIGluc3RlYWQuIFJlYWRlcnMgd2hvIHdhbnQgdG8gdW5jb21tZW50IHNlY3Rpb24sIHNlbGVjdCB0aGUgbGluZXMgdG8gdW5jb21tZW50IGFuZCBwcmVzcyBDdHJsICsgU2hpZnQgKyBDIChvbiBXaW5kb3dzL0xpbnV4KSBvciBDbWQgKyBTaGlmdCArIEMgKG9uIG1hY09TKQ0KDQojYXBwbHkgdGhlIGZ1bmN0aW9ucyB0byBvdXIgcmVzdWx0IG1hdHJpeCwgdGhlcmVmb3JlIGNhbGN1bGF0ZSBmb3IgZWFjaCBkcmF3biBzYW1wbGUgdGhlIHBvbGFyaXphdGlvbiBtZXRyaWNzDQojIEJDX3Jlc3VsdCA8LSBhcHBseShyZXN1bHRbLC1jKDE6MildLCAxLCBjYWxjX2JpbW9kYWxpdHlfY29lZmZpY2llbnQpDQojIHN1bShpcy5uYShCQ19yZXN1bHQpKQ0KIyANCiMgZ3JvdXBfZGl2ZXJnZW5jZV9yZXN1bHQgPC0gYXBwbHkocmVzdWx0WywtYygxOjIpXSwgMSwgY2FsY19ncm91cF9kaXZlcmdlbmNlKQ0KIyBzdW0oaXMubmEoZ3JvdXBfZGl2ZXJnZW5jZV9yZXN1bHQpKQ0KIyANCiMgIyBSZWdpc3RlciBwYXJhbGxlbCBiYWNrZW5kIHdpdGggdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGNvcmVzDQojIG51bV9jb3JlcyA8LSBkZXRlY3RDb3JlcygpLTENCiMgDQojIGNsIDwtIG1ha2VDbHVzdGVyKG51bV9jb3JlcykNCiMgcmVnaXN0ZXJEb1BhcmFsbGVsKGNsKQ0KIyANCiMgIyBQZXJmb3JtIHBhcmFsbGVsIHByb2Nlc3NpbmcgdXNpbmcgZm9yZWFjaCwgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGRpZmZlcmVudCBkcmF3biBzYW1wbGVzDQojIHBvbGFyaXphdGlvbl9yZXN1bHQgPC0gZm9yZWFjaChpID0gMTpucm93KHJlc3VsdCksIC5jb21iaW5lID0gcmJpbmQpICVkb3BhciUgew0KIyAgIGNhbGNfcG9sYXJpemF0aW9uKHJlc3VsdFtpLCAtYygxOjIpXSkNCiMgfQ0KIyBzdW0oaXMubmEocG9sYXJpemF0aW9uX3Jlc3VsdCkpDQojIA0KIyAjIFN0b3AgdGhlIHBhcmFsbGVsIGJhY2tlbmQNCiMgc3RvcENsdXN0ZXIoY2wpDQojIA0KIyANCiMgY29tYmluZWRfcmVzdWx0X21lYXN1cmVzIDwtIGNiaW5kKHBvbGFyaXphdGlvbl9yZXN1bHQsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9kaXZlcmdlbmNlX3Jlc3VsdCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDX3Jlc3VsdCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFssMToyXQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KIyBzdW0oaXMubmEoY29tYmluZWRfcmVzdWx0X21lYXN1cmVzKSkNCiMNCiMgc2F2ZVJEUyhjb21iaW5lZF9yZXN1bHRfbWVhc3VyZXMsICJzYXZlZF9SRFNcXGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlc19wb3dlcl9hbmFseXNpcy5yZHMiKQ0KDQpjb21iaW5lZF9yZXN1bHRfbWVhc3VyZXMgPC0gcmVhZFJEUygic2F2ZWRfUkRTXFxjb21iaW5lZF9yZXN1bHRfbWVhc3VyZXNfcG93ZXJfYW5hbHlzaXMucmRzIikNCg0KdmlzX21pc3MoY29tYmluZWRfcmVzdWx0X21lYXN1cmVzLCBzb3J0X21pc3MgPSBGKQ0KYGBgDQogIA0KQWZ0ZXIgd2UndmUgY2FsY3VsYXRlZCB0aGUgb3BlcmF0aW9uYWxpc2F0aW9uIG1lYXN1cmVzIGZvciBlYWNoIG9mIHRoZSBgYHIgbnJvdyhyZXN1bHQpYGAgZHJhd24gc2FtcGxlcywgdGhlIG1lYXN1cmVzIHdlcmUgcHV0IGludG8gYSBkYXRhIGZyYW1lLiBBcyB3ZSBjYW4gc2VlLCBubyBtaXNzaW5nIHZhbHVlcyBhcmUgaGVyZSwgaW5kaWNhdGluZyB0aGF0IGVhY2ggbWVhc3VyZSB3YXMgY2FsY3VsYXRlZCBzdWNjZXNzZnVsbHkuICANCg0KIyMgUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMgUG9sYXJpemF0aW9uIFZhbHVlcyBmb3IgdGhlIFBvcHVsYXRpb24gRGlzdHJpYnV0aW9uDQoNCmBgYHtyIERpc3BsYXkgUG9sYXJpemF0aW9uIE1lYXN1cmVzIGZvciBhbGwgRGlzdHJpYnV0aW9uc30NCkJDX3BvcCA8LSBhcHBseShyb3RfUG9wX2RmLCAxLCBjYWxjX2JpbW9kYWxpdHlfY29lZmZpY2llbnQpDQpHRF9wb3AgPC0gYXBwbHkocm90X1BvcF9kZiwgMSwgY2FsY19ncm91cF9kaXZlcmdlbmNlKSANClBvbF9wb3A8LSBhcHBseShyb3RfUG9wX2RmLCAxLCBjYWxjX3BvbGFyaXphdGlvbikNClBvbF9tZWFzdXJlc19wb3AgPC0gZGF0YS5mcmFtZShCQ19wb3AsIEdEX3BvcCwgUG9sX3BvcCkNClBvbF9tZWFzdXJlc19wb3AkYFBvbC4gRGlzdHJpYnV0aW9uYCA8LSByb3duYW1lcyhQb2xfbWVhc3VyZXNfcG9wKQ0KDQpQb2xfbWVhc3VyZXNfcG9wICU+JSANCiAgIHNlbGVjdChgUG9sLiBEaXN0cmlidXRpb25gLCBldmVyeXRoaW5nKCkpICU+JSANCiAgIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgDQogICAgICAgICBjYXB0aW9uID0gIlBvbGFyaXphdGlvbiBNZWFzdXJlcyBpbiB0aGUgUG9wdWxhdGlvbiBEaXN0cmlidXRpb25zIiwgDQogICAgICAgICBkaWdpdHMgPSAzLCANCiAgICAgICAgIGNvbC5uYW1lcyA9IGMoIlBvcHVsYXRpb24gRGlzdHJpYnV0aW9uIiwgIkJpbW9kYWxpdHkgQ29lZmZpY2llbnQiLCAiR3JvdXAgRGl2ZXJnZW5jZSIsICJQb2xhcml6YXRpb24iKSwgDQogICAgICAgICBhbGlnbiA9ICJjIiwNCiAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKSAlPiUgDQogICBrYWJsZUV4dHJhOjpyb3dfc3BlYyhyb3cgPSAwLCBhbmdsZSA9IC0xMCkNCmBgYA0KDQojIyMgRHJhd24gU2FtcGxlIFRhYmxlIA0KYGBge3IgQ3JlYXRlIERpY2hvdG9tZSBmYWN0b3Igb2YgUG9sYXJpemVkIGFuZCBOb25lLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KI2ZvciBlYWNoIG1lYXN1cmUsIHVzZSB0aGUgdGhyZXNob2xkIGRlZmluZWQgaW4gdGhlIG1ldGhvZHMgc2VjdGlvbg0KY29tYmluZWRfcmVzdWx0X21lYXN1cmVzIDwtIGNvbWJpbmVkX3Jlc3VsdF9tZWFzdXJlcyAlPiUgDQogICBtdXRhdGUoQkNfUG9sID0gaWZfZWxzZShCQ19yZXN1bHQgPj0gQkNfdGhyZXNob2xkLCAxLCAwKSwNCiAgICAgICAgICBwb2xhcml6YXRpb25fUG9sID0gaWZfZWxzZShwb2xhcml6YXRpb25fcmVzdWx0ID49IHBvbGFyaXphdGlvbl90aHJlc2hvbGQsIDEsIDApLA0KICAgICAgICAgIGdyb3VwX2RpdmVyZ2VuY2VfUG9sID0gaWZfZWxzZShncm91cF9kaXZlcmdlbmNlX3Jlc3VsdCA+PSBncm91cF9kaXZlcmdlbmNlX3RocmVzaG9sZCwgMSwgMCksDQogICAgICAgICAgdHJhbnNsX3Jpc2tfZGlzdHIgPSBmYWN0b3Iocmlza19kaXN0cmlidXRpb24sIGxhYmVscyA9IGMoIk5vbmUiLCAiUmFyZSIsICJTbWFsbCBQb2wuIiwgIlN0cm9uZyBQb2wuIikpLA0KICAgICAgICAgIHRyYW5zbF9yaXNrX2Rpc3RyID0gZmFjdG9yKHRyYW5zbF9yaXNrX2Rpc3RyLCBsZXZlbHMgPSBjKCJOb25lIiwgIlNtYWxsIFBvbC4iLCAiUmFyZSIsICJTdHJvbmcgUG9sLiIpKSkNCg0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgPC0gY29tYmluZWRfcmVzdWx0X21lYXN1cmVzICU+JSANCiAgIHBpdm90X2xvbmdlcihjb250YWlucygiX1BvbCIpLCBuYW1lc190byA9ICJNZWFzdXJlIiwgdmFsdWVzX3RvID0gImlzX3BvbGFyaXplZCIpICU+JSANCiAgIG11dGF0ZShNZWFzdXJlID0gc3RyX3JlbW92ZShNZWFzdXJlLCAiX1BvbCIpKSAlPiUNCiAgIGdyb3VwX2J5KE1lYXN1cmUsdHJhbnNsX3Jpc2tfZGlzdHIsIHNhbXBsZV9zaXplKSAlPiUgDQogICBzdW1tYXJpc2UoYFByb3BfYXNfcG9sYXJpemVkX2luXyVgID0gc3VtKGlzX3BvbGFyaXplZCkvcmVwbGljYXRpb25zX3Blcl9zZXR0aW5nICogMTAwKQ0KDQpzdW1tYXJpc2VkX3Jlc3VsdF9tZWFzdXJlcyAlPiUNCiAgIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYFByb3BfYXNfcG9sYXJpemVkX2luXyVgLA0KICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IE1lYXN1cmUpICU+JSANCiAgIHJlbmFtZShgUG9sYXJpemF0aW9uIEdyYWRlYCA9IHRyYW5zbF9yaXNrX2Rpc3RyLCANCiAgICAgICAgICBgU2FtcGxlIFNpemVgID0gc2FtcGxlX3NpemUsDQogICAgICAgICAgYEJpbW9kYWxpdHkgQ29lZmZpY2llbnRgID0gQkMsDQogICAgICAgICAgYEdyb3VwIERpdmVyZ2VuY2VgID0gZ3JvdXBfZGl2ZXJnZW5jZSwNCiAgICAgICAgICBQb2xhcml6YXRpb24gPSBwb2xhcml6YXRpb24pICU+JSANCiAgIHBhZ2VkX3RhYmxlKG9wdGlvbnMgPSBsaXN0KHJvd25hbWVzLnByaW50ID0gRiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHJpbnQgPSBsZW5ndGgoc2FtcGxlX3NlcXVlbmNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMubWluLnByaW50ID0gNSkpDQpgYGANCiMjIyBPdmVyYWxsIFBsb3QNCmBgYHtyIFBsb3QgUmVzdWx0c30NCg0Kc3VtbWFyaXNlZF9yZXN1bHRfbWVhc3VyZXMgJT4lIA0KICAgbXV0YXRlKE1lYXN1cmUgPSBjYXNlX3doZW4oTWVhc3VyZSA9PSAiQkMifiAiQmltb2RhbCBDb2VmZmljaWVudCIsDQogICAgICAgICAgICAgICAgICAgIE1lYXN1cmUgPT0gImdyb3VwX2RpdmVyZ2VuY2UiIH4gIkdyb3VwIERpdmVyZ2VuY2UiLA0KICAgICAgICAgICAgICAgICAgICBNZWFzdXJlID09ICJwb2xhcml6YXRpb24iIH4gIlBvbGFyaXphdGlvbiIpKSAlPiUgDQogICBnZ3Bsb3QoYWVzKHNhbXBsZV9zaXplLCBgUHJvcF9hc19wb2xhcml6ZWRfaW5fJWAsIGNvbCA9IHRyYW5zbF9yaXNrX2Rpc3RyLCBncm91cCA9IHRyYW5zbF9yaXNrX2Rpc3RyKSkrDQogICBnZW9tX2xpbmUobGluZXdpZHRoID0gLjkpKw0KICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhNZWFzdXJlKSkrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2FtcGxlX3NlcXVlbmNlKSsNCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpKw0KICAgdGhlbWVfbWluaW1hbCgpKw0KICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSsNCiAgIGdlb21fdGV4dChhZXMoeD0gc2FtcGxlX3NlcXVlbmNlW2xlbmd0aChzYW1wbGVfc2VxdWVuY2UpLzIrIDNdLHkgPSA1MCwgbGFiZWw9IE1lYXN1cmUpLCBzaXplID0gNywgaW5oZXJpdC5hZXMgPSBGQUxTRSkNCg0KDQpgYGANCg0KIyMgey0gLnRhYnNldH0NCg0KYGBge3IgSW5kaXZpZHVhbCBQbG90cyBieSBQb2xhcml6YXRpb24gTWVhc3VyZX0NCnN1bW1hcmlzZWRfcmVzdWx0X21lYXN1cmVzICU+JSANCiAgIGZpbHRlcihNZWFzdXJlID09ICJCQyIpDQogICANCg0KYGBgDQoNCg0KDQoNCiMjIERpc2N1c3Npb24NCg0KIyMjIExpbWl0YXRpb25zDQphcyBsaWtlIGluIGFsbCBjbGFzc2lmaWNhdGlvbnMsIG5vIGNsZWFyIGN1dCBsaW5lIGJldHdlZW4gcG9sIHZzIG5vbmUsIGJ1dCBncmFkdWFsLg0KDQppbiBhY2NvcmRhbmNlIHRvIHRoZSBwcmV2aW91cyBvbmUsIHNldHRpbmcgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcmFyZSBwb2xhcml6YXRpb24gaXMsIGluIGZhY3QsIHBvbGFyaXplZCwgbWF5IG5vdCBob2xkIHdlbGwgaW4gdGhlIHN0dWR5IGl0c2VsZiwgYXMgc21hbGxlciBvdXRsaWVycywgbWlzaW50ZXJwcmV0YXRpb24gb3IgZXZlbiBhIG1vdXNlIHNsaXAgbWF5IGNvbnRyaWJ1dGUgdG8gc3VjaCBhIGRpc3RyaWJ1dGlvbiwgd2hpY2ggd2Ugd291bGQgdGhlbiBqdXN0IGFzc3VtZSBpcyBwb2xhcml6ZWQuDQoNCnRoZSB0cmVzaGhvbGQgd2VyZSBzZXQgc29tZXdoYXQgYXJiaXRyYXJ5LCBhbmQgdGhlcmVmb3JlLCBtYXkgbm90IGhvbGQgaW4gdGhlIHJlYWwgZGVhbCwgYW5kIGNhbm5vdCBiZSBnZW5lcmFsaXplZCBmb3IgZnVydGhlciBkaXN0cmlidXRpb25zLCBidXQgb25seSBmb3IgdGhlIG9uZXMgc2VlbiBoZXJlLiBPbmUgbWlnaHQgY2hhbmdlIHRoZSB0cmVzaGhvbGQgdG8gZmluZCBhbiBvcHRpbWl6ZWQgb25lIHdoZXJlIHdlIHdvdWxkIGhhdmUgdGhlIGxlYXN0IGZhbHNlIHBvc2l0aXZlcyBhbmQgZmFsc2UgbmVnYXRpdmVzLCBidXQgdGhpcyB0aHJlc2hvbGQgd2lsbCBub3QgZ2VuZXJhbGl6ZSBmb3Igb3RoZXIgZGlzdHJpYnV0aW9ucy4gQXMgc3VjaCwgSSdsbCByZWZyYWluIGZyb20gZmluZGluZyB0aGUgb3B0aW11bSwgYXMgaXQgd291bGQgbmV0IHVzIG5vdCBhbnkgYWRkaXRpb25hbCBpbnNpZ2h0IHRvIG91ciBjYXVzZS4NCg0Kb25seSAzIG1lYXN1cmVzIG9mIG9wZXJhdGlvYWxpemF0aW9uIHdhcyB1c2VkLCBhbmQgdGh1cywgbm90IGV2ZXJ5IGFzcGVjdCBvZiBvcGVyYXRpb25hbGl6YXRpb24gd2FzIGNvdmVyZWQuDQoNCiMjIyBDb25jbHVzaW9ucw0KDQojIyBDcmVkaXRzDQoNCiMjIyBBY2tub3dsZWRnZW1lbnRzDQoNCg0KIyMjIFIgUGFja2FnZXMgVXNlZA0KDQojIyMgVXNlIG9mIEFJ